package red.social;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;


import java.math.BigDecimal;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;

import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;


import org.w3c.dom.Document;
import org.xml.sax.SAXException;


import android.app.AlertDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import android.os.Bundle;
import android.util.Log;

import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;

import android.view.View.OnTouchListener;

import android.widget.Toast;


import red.social.*;


import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
import com.google.android.maps.Overlay;

public  class ActividadPosicion extends MapActivity {

	
	private MapView mMapa;	
	/**
	 * Variable para el control del mapa.
	 */
	private MapController mControlMapa;
	
	/**
	 * Variable para el control de los overlay de mapa.
	 */
	private List<Overlay> mMapOverlays;
	/**
		
	/**
	 * Variable a la que asignamos el overlay de la localizaci�n del usuario.
	 */
	private MyLocationOverlay mMiPosicion;
	
	
	/** AlertDialog que se mostrar� al pulsar sobre un Overlay **/
	AlertDialog dialogoRuta;
	
	/**** Overlay que representa los amigos ****/
	ArrayList<AnimacionOverLay> animacion;
	
	/*** GeoPunto con la �ltima posici�n ***/
	
	 GeoPoint Ultima_posicion;
	 
	 boolean esp;
	 
	 String ip;
	 
	 int idamigo;
	
	/** Se llama a este m�todo cuando se crea la actividad.
     * 
     * @param savedInstanceState Contendr� los datos guardados a trav�s del m�todo onSavedInstance(Bundle) si la actividad a sido arrancada poco despu�s de haber sido cerrada.
     */
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //Le damos una vista que mostrar al programa
        setContentView(red.social.R.layout.mapa);
        
        idamigo = this.getIntent().getExtras().getInt("idamigo");
      
        //Recogemos los widgets de la interfaz
        mMapa = (MapView)findViewById(red.social.R.id.mapView);
        //Creamos el controlador del mapa.
        mControlMapa = mMapa.getController();
        //Creamos los controles de zoom del mapa.
        mMapa.setBuiltInZoomControls(true);
        //Configuramos la vista del mapa.
        mMapa.setSatellite(true);
        //Configuramos el zoom por defecto
        
        mControlMapa.setZoom(16);
        
        
        System.out.println("mMapa widht: "+mMapa.getWidth());
        System.out.println("mMapa height: "+mMapa.getHeight());

        animacion = new ArrayList<AnimacionOverLay>();
        
        ip = getResources().getString(R.string.ip);
        
        //Mostramos los Overlays
     
//        dibujar();
       //Creamos el overlay de posici�n del usuario.
        mMiPosicion = new MyLocationOverlay(this, mMapa);       
        //Activamos la localizaci�n del usuario si la hay
        mMiPosicion.enableMyLocation();
        //Movemos el mapa a la localizaci�n del usuario        
        mMiPosicion.runOnFirstFix(new Runnable() 
		{ 
			public void run() 
			{
				Ultima_posicion = mMiPosicion.getMyLocation();
				mControlMapa.animateTo(Ultima_posicion);
				
	        }
		});
               
        //A�adimos mi posici�n al control de overlays.
        mMapa.getOverlays().add(mMiPosicion);
        
        boolean ontap= false;
        
        ontap = this.getIntent().getExtras().getBoolean("ontap");

        dibujar();
        
	}
     
	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}
	
	/**Metodo que implementa el evento de menu creado.
	 * 
	 * @return Devuelve si ha podido crearse o no el menu.
	 */
	//@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		boolean result = super.onCreateOptionsMenu(menu);
		//A�adimos al men� la b�squeda de amigos(id=0)
		
		
		menu.add(0, 0, 0, "Sat�lite").setIcon(red.social.R.drawable.menu_map);
		
		menu.add(0, 1, 0, "Callejero").setIcon(red.social.R.drawable.menu_map);
		
	
		return result;
	}
    
    /**Metodo que implementa el evento de pulsacion en uno de los elementos del menu.
	 * 
	 * @return Devuelve verdadero si el evento es tratado en este metodo, falso en caso contrario.
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item)
	{	
		switch (item.getItemId())
		{
			//Si se ha pulsado el bot�n de cambiar mapa
			case 0:
				
				mMapa.setSatellite(true);
			return true;
			
			//Si se ha pulsado el bot�n de cambiar mapa
			case 1:
				
				mMapa.setSatellite(false);
			return true;
			
			
		}	
		
		return super.onOptionsItemSelected(item);
	}

	
	
	public void dibujar(){
		
		mMapa.getOverlays().removeAll(animacion);
		
		animacion.clear();
		
		try {
		
		String servletURL = "http://" + ip + ":8080/Modulo10-war/PosicionAmigos";

		URL ob = new URL(servletURL + "?idamigo=" + idamigo);
		URLConnection conn = ob.openConnection();
		conn.setDoInput(true);
		conn.setDoOutput(true);
		InputStream in = conn.getInputStream();
		ObjectInputStream dos = new ObjectInputStream(in);
		
		int amigos = dos.readInt();
		
		for (int i =0; i<amigos;i++){
			
			double dx = Double.valueOf((String)dos.readObject());
			double dy = Double.valueOf((String)dos.readObject());
			
			int iX =(int) dx;
			
			int iY = (int)dy;
			
			String nombre = (String) dos.readObject();
			
			
			byte[] bImagen = (byte[])dos.readObject();
			
			Bitmap m = BitmapFactory.decodeByteArray(bImagen, 0, bImagen.length);
			
			GeoPoint g  = new GeoPoint(iY,iX);			
			animacion.add(new AnimacionOverLay(this,320,480,g,nombre,this,m));
			Log.i("Geopint",g.toString());
			
			
		}
		
		
		} catch (Exception e) {
			e.printStackTrace();
		}
    	
		mMapa.getOverlays().addAll(animacion);
		
		
	}
	
	
	public void DrawPath(GeoPoint src,GeoPoint dest, MapView mMapView01)
	{
	// Conectamos al servicio web
	StringBuilder urlString = new StringBuilder();
	urlString.append("http://maps.google.com/maps?f=d&hl=en");
	urlString.append("&saddr=");//from
	urlString.append( Double.toString((double)src.getLatitudeE6()/1.0E6 ));
	urlString.append(",");
	urlString.append( Double.toString((double)src.getLongitudeE6()/1.0E6 ));
	urlString.append("&daddr=");//to
	urlString.append( Double.toString((double)dest.getLatitudeE6()/1.0E6 ));
	urlString.append(",");
	urlString.append( Double.toString((double)dest.getLongitudeE6()/1.0E6 ));
	urlString.append("&ie=UTF8&0&om=0&output=kml&dirflg=h");
	Log.d("xxx","URL="+urlString.toString());
	//Obtenemos el archivo XML y lo parseamos para obtener las coordenadas.
	Document doc = null;
	HttpURLConnection urlConnection= null;
	URL url = null;
	try
	{
	url = new URL(urlString.toString());
	urlConnection=(HttpURLConnection)url.openConnection();
	urlConnection.setRequestMethod("GET");
	urlConnection.setDoOutput(true);
	urlConnection.setDoInput(true);
	urlConnection.connect();

	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
	DocumentBuilder db = dbf.newDocumentBuilder();
	doc = db.parse(urlConnection.getInputStream());

	if(doc.getElementsByTagName("GeometryCollection").getLength()>0)
	{
	//String path = doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getNodeName();
	String path = doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getFirstChild().getNodeValue() ;
	Log.d("xxx","path="+ path);
	String [] pairs = path.split(" ");
	String[] lngLat = pairs[0].split(","); // lngLat[0]=longitude lngLat[1]=latitude lngLat[2]=height
	// src
	GeoPoint startGP = new GeoPoint((int)(Double.parseDouble(lngLat[1])*1E6),(int)(Double.parseDouble(lngLat[0])*1E6));
	mMapa.getOverlays().add(new MyOverLay(startGP,startGP,1));
	GeoPoint gp1;
	GeoPoint gp2 = startGP;
	for(int i=1;i<pairs.length;i++) // the last one would be crash
	{
	lngLat = pairs[i].split(",");
	gp1 = gp2;
	// watch out! For GeoPoint, first:latitude, second:longitude
	gp2 = new GeoPoint((int)(Double.parseDouble(lngLat[1])*1E6),(int)(Double.parseDouble(lngLat[0])*1E6));
	mMapa.getOverlays().add(new MyOverLay(gp1,gp2,2,999));
	Log.d("xxx","pair:" + pairs[i]);
	}
	mMapa.getOverlays().add(new MyOverLay(dest,dest, 1)); // use the default color
	}
	}
	catch (MalformedURLException e)
	{
	e.printStackTrace();
	}
	catch (IOException e)
	{
	e.printStackTrace();
	}
	catch (ParserConfigurationException e)
	{
	e.printStackTrace();
	}
	catch (SAXException e)
	{
	e.printStackTrace();
	}
	}

	
	
	public void establecerRuta(GeoPoint destino){
	    
    		DrawPath(Ultima_posicion,destino,mMapa);
    	
	   
    
	}
	

}

